
/*
 * 1、Buffer 创建方式（十六进制存储）
 * - form：初始化 string/object 等，一个字符占一个位置
 * - alloc：初始化一个指定长度的空 buf，内容全部以 00 填充
 * 
 * 一个字符 = 8 个字节
 * alloc(4) -> 创建 4 个字符的长度 = 32 个字节
 * writeInt32BE -> 写入 32 个字节
 * alloc 创建的 buf，如果写入的话字节数得对应上，比如上面这个，用 Int8 或 Int16 是不行的
 */
const buffer1 = Buffer.from('geekbang')
const buffer2 = Buffer.from([1, 2 , 3, 4])
const buffer3 = Buffer.alloc(20)

console.log(buffer1)
console.log(buffer2)
console.log(buffer3)

/*
 * 2、Buffer 写入方式
 * - writeInt：第一位代表写入的 int 内容，第二位代表写入的起始位置
 * - 写入方式区别
 *   - BE：大端在前，比如写入 512 就对应 02 00
 *   - LE：大端在后，比如写入 512 就对应 00 02
 * - 理解：
 *   - 从指定的下标开始，往后写入，占用固定的字节数
 */
buffer2.writeInt8(12, 1)
console.log(buffer2)
buffer2.writeInt16LE(512, 2)
console.log(buffer2)
buffer2.writeInt16BE(512, 2)
console.log(buffer2)


/*
 * 3、使用 protocol-buffers 来快速编解码 buffer
 * - obj -> buf, buf -> obj 
 * 
 * 插件的作用：
 *   - 不使用插件的话，对于 object，需要手动进行字节分配与写入，还需要手动输出，过程比较麻烦
 *   - 对于 http 请求，将 object 转化为 json，可以直接 Json.stringfy() 就可以得到一个 json 对象
 *   - 使用 protocol-buffers 要达到的也是这样的效果
 * 
 * protocol-buffers
 *   - 先创建一个由 obj 映射得到的 proto 数据模型
 *   - 再用 protocol-buffers 实例化这个模型，得到后面需要操作的流模型
 *   - 流模型 encode(obj) 可以将 obj 编码为 buffer
 *   - 流模型 decode(buf) 可以将 buf 解码为 obj
 */

// const fs = require('fs')
// const protobuf = require('protocol-buffers')
// const stream = protobuf(fs.readFileSync(__dirname + '/test.proto', 'utf-8'))

// console.log(stream)
// const buffer4 = stream.Column.encode({
//     id: 10,
//     name: 'node.js',
//     price: 99.9
// })
// console.log(buffer4)
// console.log(stream.Column.decode(buffer4))
